package com.lefu.es.view;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Filter;

import com.wellness.scale.R;


public class DiseaseAutoCompleteTextView extends AutoCompleteTextView implements OnFocusChangeListener  {
	private InputStatu inputStatu;
    /**
     * 删除按钮的引用
     */
    private Drawable mClearDrawable;
    /**
     * 控件是否有焦点
     */
    private boolean  hasFoucs;
	public DiseaseAutoCompleteTextView(Context context, AttributeSet attrs,
			int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	public DiseaseAutoCompleteTextView(Context context, AttributeSet attrs) {
//		super(context, attrs);
	 // 这里构造方法也很重要，不加这个很多属性不能再XML里面定义
        this(context, attrs, android.R.attr.editTextStyle);
//		init();
	}

	public DiseaseAutoCompleteTextView(Context context) {
//		super(context);
	    this(context, null);
//		init();
	}
	
	private void init() {
		//setThreshold为1表示输入一个字符就开始自动提示，系统默认的是2，即输入两个有提示
		setThreshold(1); 
		// 获取EditText的DrawableRight,假如没有设置我们就使用默认的图片
        mClearDrawable = getCompoundDrawables()[2];
        if (mClearDrawable == null) {
            // throw new NullPointerException("You can add drawableRight attribute in XML");
            mClearDrawable = getResources().getDrawable(R.drawable.search_clear);
        }

        //mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());
        // 默认设置隐藏图标
        setClearIconVisible(false);
     // 设置焦点改变的监听
        setOnFocusChangeListener(this);
		setAdapter(new HintAdapter(getContext(), R.layout.disease_hint_list_item));
	}
    /**
     * 设置清除图标的显示与隐藏，调用setCompoundDrawables为EditText绘制上去
     * 
     * @param visible
     */
    protected void setClearIconVisible(boolean visible) {
        Drawable right = visible ? mClearDrawable : null;
        setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
        if (null != inputStatu)
            inputStatu.onInput(visible);
    }
    
	
	
	private class HintAdapter extends ArrayAdapter<String> {
		private Filter mFilter = null;
		
		public HintAdapter(Context context, int resource) {
			super(context, resource);
		}
		
		@Override
		public Filter getFilter() {
			if (mFilter == null) {
				mFilter = new Filter() {
					@Override
					protected void publishResults(CharSequence constraint, FilterResults results) {
						clear();
						
					}
					
					@Override
					protected FilterResults performFiltering(CharSequence constraint) {
						
						return null;
					}
				};
			}
			return mFilter;
		}
	}

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        this.hasFoucs = hasFocus;
        if (hasFocus) {
            setClearIconVisible(getText().length() > 0);
        } else {
            setClearIconVisible(false);
        }
    }
    
    /**
     * 当输入框里面内容发生变化的时候回调的方法
     */
    @Override
    public void onTextChanged(CharSequence s, int start, int count, int after) {
        if (hasFoucs) {
            setClearIconVisible(s.length() > 0);
        }
    }
    
    public interface InputStatu{
        void onInput(boolean b);
    }
    
    public void setInputStatu(InputStatu inputStatu){
        this.inputStatu = inputStatu;
    }
    

    /**
     * 因为我们不能直接给EditText设置点击事件，所以我们用记住我们按下的位置来模拟点击事件 当我们按下的位置 在 EditText的宽度 - 图标到控件右边的间距 - 图标的宽度 和 EditText的宽度 -
     * 图标到控件右边的间距之间我们就算点击了图标，竖直方向就没有考虑
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            if (getCompoundDrawables()[2] != null) {
                boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())
                        && (event.getX() < ((getWidth() - getPaddingRight())));
                if (touchable) {
                    this.setText("");
                }
            }
        }
        return super.onTouchEvent(event);
    }
}
